import functools


class MyClass:
    """Demonstration class for functools"""

    def __call__(self, e, f=6):
        """Docstring for MyClass.__call__"""
        print('  called object with: ', (self, e, f))


def show_details(name, f):
    """show details of a callable object"""
    print('{} : '.format(name))
    print('   object : ', f)
    print('   __name__ : ', end=' ')
    try:
        print(f.__name__)
    except AttributeError:
        print('(no __name__)')
    print('   __doc__', repr(f.__doc__))
    return


o = MyClass()

show_details('instance', o)
o('e go here')
print()

p = functools.partial(o, e='default for e, f=8')
functools.update_wrapper(p, o)
show_details('instance wrapper', p)
p()
